#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <unistd.h>
#include <semaphore.h>

// 信号量变量
sem_t sem;
void * funA(void * arg){
    // 申请资源 将可用资源-1
    sem_wait(&sem);
    for(int c = 'A';c <= 'Z'; c++){
        putchar(c);
        fflush(stdout);
        usleep(100000);
    }
    // 释放资源 将可用资源+1
    sem_post(&sem);
    return NULL;
}

void * funa(void * arg){
    // 申请资源 将可用资源-1
    sem_wait(&sem);
    for(int c = 'a';c <= 'z'; c++){
        putchar(c);
        fflush(stdout);
        usleep(100000);
    }
    // 释放资源 将可用资源+1
    sem_post(&sem);
    return NULL;
}

/**
 * 信号量 本质上时一个非负的证书计数器，被用来控制对公共资源的访问
 *      根据操作信号量值的结果判断是否对公共资源具有访问权限，信号量值 大于0 可以访问，否则阻塞
 *      PV原语 是对信号量的操作，一次P操作信号量 -1，一次V操作信号量 +1
 *      主要用于进程或线程的同步和互斥
 *
 * @return
 */
int main(){
    pthread_t tid1;
    pthread_t tid2;

    int ret = -1;

    // 初始化
    ret = sem_init(&sem,0,1);

    printf("初始化 信号量 成功！");

    memset(&tid1,0,sizeof(tid1));
    memset(&tid2,0,sizeof(tid2));
    ret = pthread_create(&tid1,NULL,funA,NULL);
    ret = pthread_create(&tid2,NULL,funa,NULL);
    printf("main run\n");
    // 阻塞等待线程运行结束，并且获取线程的返回指针
    ret = pthread_join(tid1,NULL);
    ret = pthread_join(tid2,NULL);
    printf("\n");
    printf("main exit\n");
    // 销毁
    sem_destroy(&sem);
    printf("销毁 信号量 成功！\n");
    return 0;
}
